//访问器装饰器
//基本语法
/*
 参数说明：
 ○ target:
 1. 对于实例访问器来说值是【所属类的原型对象】。
 2. 对于静态访问器来说值是【所属类】。
 ○ propertyKey:访问器的名称。
 ○ descriptor: 描述对象。
*/

function CustomDemo24(target: object, propertyKey: string, descriptor: PropertyDescriptor) {
    console.log(target)
    console.log(propertyKey)
    console.log(descriptor)
}

class Person24 {
    @CustomDemo24
    get address() {
        return '北京宏福科技园'
    }
    @CustomDemo24
    static get country() {
        return '中国'
    }
}

const p24 = new Person24()
// console.log(p24.address())
console.log(p24.address)
console.log(Person24.country)


//应⽤举例
// 需求：对 Weather 类的 temp 属性的 set 访问器进⾏限制，设置的最低温度 -50 ，最⾼温度 50
function RangeValidate(min: number, max: number) {
    return function (target: object, propertyKey: string, descriptor: PropertyDescriptor) {
        // 保存原始的 setter ⽅法，以便在后续调⽤中使⽤
        const originalSetter = descriptor.set;
        // 重写 setter ⽅法，加⼊范围验证逻辑
        descriptor.set = function (value: number) {
            // 检查设置的值是否在指定的最⼩值和最⼤值之间
            if (value < min || value > max) {
                // 如果值不在范围内，抛出错误
                throw new Error(`${propertyKey}的值应该在 ${min} 到 ${max}之间！`);
            }

            // 如果值在范围内，且原始 setter ⽅法存在，则调⽤原始 setter ⽅法
            if (originalSetter) {
                originalSetter.call(this, value);
            }
        };
    };
}

class Weather {
    private _temp: number;
    constructor(_temp: number) {
        this._temp = _temp;
    }
    // 设置温度范围在 -50 到 50 之间
    @RangeValidate(-50, 50)
    set temp(value) {
        this._temp = value;
    }
    get temp() {
        return this._temp;
    }
}

const we = new Weather(80)
console.log(we.temp)
we.temp = 40
console.log(we.temp)
